/**
 * @file TaskQueue.hpp
 * @brief 任务队列类的声明
 * @details 线程安全的任务队列，支持生产者消费者模式
 */

#ifndef __TaskQueue_H__
#define __TaskQueue_H__

#include "MutexLock.hpp"
#include "Condition.hpp"
#include "Task.hpp"

#include <queue>
using std::queue;

namespace wd
{

using ElemType=Task;

/**
 * @class TaskQueue
 * @brief 任务队列类
 * @details 线程安全的阻塞队列，使用互斥锁和条件变量实现同步
 */
class TaskQueue
{
public:
    /**
     * @brief 构造函数
     * @param sz 队列最大容量
     */
    TaskQueue(size_t sz);

    /**
     * @brief 检查队列是否已满
     * @return 满返回true，否则返回false
     */
    bool full() const;
    
    /**
     * @brief 检查队列是否为空
     * @return 空返回true，否则返回false
     */
    bool empty() const;
    
    /**
     * @brief 向队列添加任务（生产者）
     * @param elem 要添加的任务
     */
    void push(ElemType elem);
    
    /**
     * @brief 从队列取出任务（消费者）
     * @return 取出的任务
     */
    ElemType pop();
    
    /**
     * @brief 唤醒所有等待的线程
     */
    void wakeup();

private:
    queue<ElemType>  _que;        ///< 任务队列
    size_t      _queSize;         ///< 队列最大容量
    MutexLock   _mutex;           ///< 互斥锁
    Condition   _notFull;         ///< 非满条件变量
    Condition   _notEmpty;        ///< 非空条件变量
    bool        _flag;            ///< 唤醒标志
};



}//end of namespace wd


#endif

